home *** CD-ROM | disk | FTP | other *** search
/ Assassins - Ultimate CD Games Collection 4 / Assassins 4 (1999)(Weird Science).iso / misc / omega / source / city.c < prev    next >
C/C++ Source or Header  |  1997-05-02  |  17KB  |  653 lines

  1. /* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
  2. /* city.c */
  3. /* some functions to make the city level */
  4.  
  5. #include "glob.h"
  6.  
  7.  
  8. /* loads the city level */
  9. void load_city(populate)
  10. int populate;
  11. {
  12.   int i,j;
  13.   pml ml;
  14.   char site;
  15.   
  16.   FILE *fd;
  17.  
  18.   initrand(E_CITY, 0);
  19.  
  20.   strcpy(Str3,Omegalib);
  21.   strcat(Str3,"city.dat");
  22.   fd = checkfopen(Str3,"rb");
  23.   site = cryptkey("city.dat");
  24.  
  25.  
  26.   TempLevel = Level;
  27.   if (ok_to_free(TempLevel)) {
  28. #ifndef SAVE_LEVELS
  29.     free_level(TempLevel);
  30. #endif
  31.     TempLevel = NULL;
  32.   }
  33. #ifndef SAVE_LEVELS
  34.   Level = ((plv) checkmalloc(sizeof(levtype)));
  35. #else
  36.   msdos_changelevel(TempLevel,0,-1);
  37.   Level = &TheLevel;
  38. #endif
  39.   clear_level(Level);
  40.   Level->depth = 0;
  41.   Level->environment = E_CITY;
  42.   for(j=0;j<LENGTH;j++) {
  43.     for(i=0;i<WIDTH;i++) {
  44.       lset(i,j,SEEN);
  45.       site = getc(fd)^site;
  46.       switch(site) {
  47.       case 'g':
  48.     Level->site[i][j].locchar = FLOOR;
  49.     Level->site[i][j].p_locf = L_GARDEN;
  50.     break;
  51.       case 'y':
  52.     Level->site[i][j].locchar = FLOOR;
  53.     Level->site[i][j].p_locf = L_CEMETARY;
  54.     break;
  55.       case 'x':
  56.     assign_city_function(i,j);
  57.     break;
  58.       case 't':
  59.     Level->site[i][j].locchar = FLOOR;
  60.     Level->site[i][j].p_locf = L_TEMPLE;
  61.     CitySiteList[L_TEMPLE-CITYSITEBASE][0] = TRUE;
  62.     CitySiteList[L_TEMPLE-CITYSITEBASE][1] = i;
  63.     CitySiteList[L_TEMPLE-CITYSITEBASE][2] = j;
  64.     break;
  65.       case 'T':
  66.     Level->site[i][j].locchar = FLOOR;
  67.     Level->site[i][j].p_locf = L_PORTCULLIS_TRAP;
  68.     Level->site[i][j].aux = NOCITYMOVE;
  69.     break;
  70.       case 'R':
  71.     Level->site[i][j].locchar = FLOOR;
  72.     Level->site[i][j].p_locf = L_RAISE_PORTCULLIS;
  73.     Level->site[i][j].aux = NOCITYMOVE;
  74.     break;
  75.       case '7':
  76.     Level->site[i][j].locchar = FLOOR;
  77.     Level->site[i][j].p_locf = L_PORTCULLIS;
  78.     Level->site[i][j].aux = NOCITYMOVE;
  79.     break;
  80.       case 'C':
  81.     Level->site[i][j].locchar = OPEN_DOOR;
  82.     Level->site[i][j].p_locf = L_COLLEGE;
  83.     CitySiteList[L_COLLEGE-CITYSITEBASE][0] = TRUE;
  84.     CitySiteList[L_COLLEGE-CITYSITEBASE][1] = i;
  85.     CitySiteList[L_COLLEGE-CITYSITEBASE][2] = j;
  86.     break;
  87.       case 's':
  88.     Level->site[i][j].locchar = OPEN_DOOR;
  89.     Level->site[i][j].p_locf = L_SORCERORS;
  90.     CitySiteList[L_SORCERORS-CITYSITEBASE][0] = TRUE;
  91.     CitySiteList[L_SORCERORS-CITYSITEBASE][1] = i;
  92.     CitySiteList[L_SORCERORS-CITYSITEBASE][2] = j;
  93.     break;
  94.       case 'M':
  95.     Level->site[i][j].locchar = OPEN_DOOR;
  96.     Level->site[i][j].p_locf = L_MERC_GUILD;
  97.     CitySiteList[L_MERC_GUILD-CITYSITEBASE][0] = TRUE;
  98.     CitySiteList[L_MERC_GUILD-CITYSITEBASE][1] = i;
  99.     CitySiteList[L_MERC_GUILD-CITYSITEBASE][2] = j;
  100.     break;
  101.       case 'c':
  102.     Level->site[i][j].locchar = OPEN_DOOR;
  103.     Level->site[i][j].p_locf = L_CASTLE;
  104.     CitySiteList[L_CASTLE-CITYSITEBASE][0] = TRUE;
  105.     CitySiteList[L_CASTLE-CITYSITEBASE][1] = i;
  106.     CitySiteList[L_CASTLE-CITYSITEBASE][2] = j;
  107.     break;
  108.       case '?':
  109.     mazesite(i,j,populate);
  110.     break;
  111.       case 'P':
  112.         Level->site[i][j].locchar = OPEN_DOOR;
  113.     Level->site[i][j].p_locf = L_ORDER;
  114.     CitySiteList[L_ORDER-CITYSITEBASE][0] = TRUE;
  115.     CitySiteList[L_ORDER-CITYSITEBASE][1] = i;
  116.     CitySiteList[L_ORDER-CITYSITEBASE][2] = j;
  117.     break;
  118.       case 'H':
  119.         Level->site[i][j].locchar = OPEN_DOOR;
  120.     Level->site[i][j].p_locf = L_CHARITY;
  121.     CitySiteList[L_CHARITY-CITYSITEBASE][0] = TRUE;
  122.     CitySiteList[L_CHARITY-CITYSITEBASE][1] = i;
  123.     CitySiteList[L_CHARITY-CITYSITEBASE][2] = j;
  124.     break;
  125.       case 'j':
  126.         Level->site[i][j].locchar = FLOOR;
  127.     if (populate)
  128.       make_justiciar(i,j);
  129.         break;
  130.       case 'J':
  131.     Level->site[i][j].locchar = CLOSED_DOOR;
  132.     Level->site[i][j].p_locf = L_JAIL;
  133.     break;
  134.       case 'A':
  135.     Level->site[i][j].locchar = OPEN_DOOR;
  136.     Level->site[i][j].p_locf = L_ARENA;
  137.     CitySiteList[L_ARENA-CITYSITEBASE][0] = TRUE;
  138.     CitySiteList[L_ARENA-CITYSITEBASE][1] = i;
  139.     CitySiteList[L_ARENA-CITYSITEBASE][2] = j;
  140.     break;
  141.       case 'B':
  142.     Level->site[i][j].locchar = OPEN_DOOR;
  143.     Level->site[i][j].p_locf = L_BANK;
  144.     CitySiteList[L_BANK-CITYSITEBASE][0] = TRUE;
  145.     CitySiteList[L_BANK-CITYSITEBASE][1] = i;
  146.     CitySiteList[L_BANK-CITYSITEBASE][2] = j;
  147.     lset(i,j+1,STOPS);
  148.     lset(i+1,j,STOPS);
  149.     lset(i-1,j,STOPS);
  150.     lset(i,j-1,STOPS);
  151.     break;
  152.       case 'X':
  153.     Level->site[i][j].locchar = FLOOR;
  154.     Level->site[i][j].p_locf = L_COUNTRYSIDE;
  155.     CitySiteList[L_COUNTRYSIDE-CITYSITEBASE][0] = TRUE;
  156.     CitySiteList[L_COUNTRYSIDE-CITYSITEBASE][1] = i;
  157.     CitySiteList[L_COUNTRYSIDE-CITYSITEBASE][2] = j;
  158.     break;
  159.       case 'v':
  160.     Level->site[i][j].locchar = FLOOR;
  161.     Level->site[i][j].p_locf = L_VAULT;
  162.     Level->site[i][j].aux = NOCITYMOVE;
  163.     lset(i,j,SECRET);
  164.     break;
  165.       case 'S':
  166.     Level->site[i][j].locchar = FLOOR;
  167.     Level->site[i][j].aux = NOCITYMOVE;
  168.     lset(i,j,SECRET);
  169.     break;
  170.       case 'G':
  171.     Level->site[i][j].locchar = FLOOR;
  172.     if (populate) {
  173.       make_site_monster(i,j,ML0+3);
  174.       Level->site[i][j].creature->aux1 = i;
  175.       Level->site[i][j].creature->aux2 = j;
  176.     }
  177.     break;
  178.       case 'u':
  179.     Level->site[i][j].locchar = FLOOR;
  180.     if (populate)
  181.       make_minor_undead(i,j);
  182.     break;
  183.       case 'U':
  184.     Level->site[i][j].locchar = FLOOR;
  185.     if (populate)
  186.       make_major_undead(i,j);
  187.     break;
  188.       case 'V':
  189.     Level->site[i][j].showchar = WALL;
  190.     Level->site[i][j].locchar = FLOOR;
  191.     Level->site[i][j].p_locf = L_VAULT;
  192.     if (populate)
  193.       make_site_treasure(i,j,5);
  194.     Level->site[i][j].aux = NOCITYMOVE;
  195.     lset(i,j,SECRET);
  196.     break;
  197.       case '%':
  198.     Level->site[i][j].showchar = WALL;
  199.     Level->site[i][j].locchar = FLOOR;
  200.     Level->site[i][j].p_locf = L_TRAP_SIREN;
  201.     if (populate)
  202.       make_site_treasure(i,j,5);
  203.     Level->site[i][j].aux = NOCITYMOVE;
  204.     lset(i,j,SECRET);
  205.     break;
  206.       case '$':
  207.     Level->site[i][j].locchar = FLOOR;
  208.     if (populate)
  209.       make_site_treasure(i,j,5);
  210.     break;
  211.       case '2':
  212.     Level->site[i][j].locchar = ALTAR;
  213.     Level->site[i][j].p_locf = L_ALTAR;
  214.     Level->site[i][j].aux = ODIN;
  215.     break;
  216.       case '3':
  217.     Level->site[i][j].locchar = ALTAR;
  218.     Level->site[i][j].p_locf = L_ALTAR;
  219.     Level->site[i][j].aux = SET;
  220.     break;
  221.       case '4':
  222.     Level->site[i][j].locchar = ALTAR;
  223.     Level->site[i][j].p_locf = L_ALTAR;
  224.     Level->site[i][j].aux = ATHENA;
  225.     break;
  226.       case '5':
  227.     Level->site[i][j].locchar = ALTAR;
  228.     Level->site[i][j].p_locf = L_ALTAR;
  229.     Level->site[i][j].aux = HECATE;
  230.     break;
  231.       case '6':
  232.     Level->site[i][j].locchar = ALTAR;
  233.     Level->site[i][j].p_locf = L_ALTAR;
  234.     Level->site[i][j].aux = DESTINY;
  235.     break;
  236.       case '^':
  237.     Level->site[i][j].showchar = WALL;
  238.     Level->site[i][j].locchar = FLOOR;
  239.     Level->site[i][j].p_locf = TRAP_BASE+random_range(NUMTRAPS);
  240.     lset(i,j,SECRET);
  241.     break;
  242.       case '"':
  243.     Level->site[i][j].locchar = HEDGE;
  244.     break;
  245.       case '~':
  246.     Level->site[i][j].locchar = WATER;
  247.     Level->site[i][j].p_locf = L_WATER;
  248.     break;
  249.       case '=':
  250.     Level->site[i][j].locchar = WATER;
  251.     Level->site[i][j].p_locf = L_MAGIC_POOL;
  252.     break;
  253.       case '*':
  254.     Level->site[i][j].locchar = WALL;
  255.     Level->site[i][j].aux = 10;
  256.     break;
  257.       case '#':
  258.     Level->site[i][j].locchar = WALL;
  259.     Level->site[i][j].aux = 500;
  260.     break;
  261.       case '.':
  262.     Level->site[i][j].locchar = FLOOR;
  263.     break;
  264.       case ',':
  265.     Level->site[i][j].showchar = WALL;
  266.     Level->site[i][j].locchar = FLOOR;
  267.     Level->site[i][j].aux = NOCITYMOVE;
  268.     lset(i,j,SECRET);
  269.     break;
  270.       case '-':
  271.     Level->site[i][j].locchar = CLOSED_DOOR;
  272.     break;
  273.       case '1':
  274.     Level->site[i][j].locchar = STATUE;
  275.     break;
  276.       default:
  277.     printf("\nOops... missed a case: '%c'   \n", site);
  278.     morewait();
  279.       }
  280.  
  281.       if (loc_statusp(i,j,SEEN)) {
  282.     if (loc_statusp(i,j,SECRET))
  283.       Level->site[i][j].showchar = WALL;
  284.     else Level->site[i][j].showchar = Level->site[i][j].locchar;
  285.       }
  286.     }
  287.     site = getc(fd)^site;
  288.   }
  289.   City = Level;
  290.  
  291.   /* make all city monsters asleep, and shorten their wakeup range to 2 */
  292.   /* to prevent players from being molested by vicious monsters on */
  293.   /* the streets */
  294.   for(ml=Level->mlist;ml!=NULL;ml=ml->next) {
  295.     m_status_reset(ml->m,AWAKE);
  296.     ml->m->wakeup = 2;
  297.   }
  298.   fclose(fd);
  299.   initrand(-2, 0);
  300. }
  301.  
  302.  
  303. void assign_city_function(x,y)
  304. int x,y;
  305. {
  306.   static int setup=0;
  307.   static int next=0;
  308.   static int permutation[64]; /* number of x's in city map */
  309.   int i,j,k,l;
  310.  
  311.   Level->site[x][y].aux = TRUE;
  312.  
  313.   lset(x,y+1,STOPS);
  314.   lset(x+1,y,STOPS);
  315.   lset(x-1,y,STOPS);
  316.   lset(x,y-1,STOPS);
  317.  
  318.  
  319.   if (setup == 0) {
  320.     setup = 1;
  321.     for(i=0;i<64;i++)
  322.       permutation[i] = i;
  323.     for(i=0;i<500;i++) {
  324.       j = random_range(64);
  325.       k = random_range(64);
  326.       l = permutation[j];
  327.       permutation[j] = permutation[k];
  328.       permutation[k] = l;
  329.     }
  330.   }
  331.   if (next > 63) { /* in case someone changes the no. of x's */
  332.     Level->site[x][y].locchar = CLOSED_DOOR;
  333.     Level->site[x][y].p_locf = L_HOUSE;
  334.     if(random_range(5)) Level->site[x][y].aux = LOCKED;
  335.   }
  336.   else switch(permutation[next]) {
  337.   case 0:
  338.     Level->site[x][y].locchar = OPEN_DOOR;
  339.     Level->site[x][y].p_locf = L_ARMORER;
  340.     CitySiteList[L_ARMORER-CITYSITEBASE][1] = x;
  341.     CitySiteList[L_ARMORER-CITYSITEBASE][2] = y;
  342.     break;
  343.   case 1:
  344.     Level->site[x][y].locchar = OPEN_DOOR;
  345.     Level->site[x][y].p_locf = L_CLUB;
  346.     CitySiteList[L_CLUB-CITYSITEBASE][1] = x;
  347.     CitySiteList[L_CLUB-CITYSITEBASE][2] = y;
  348.     break;
  349.   case 2:
  350.     Level->site[x][y].locchar = OPEN_DOOR;
  351.     Level->site[x][y].p_locf = L_GYM;
  352.     CitySiteList[L_GYM-CITYSITEBASE][1] = x;
  353.     CitySiteList[L_GYM-CITYSITEBASE][2] = y;
  354.     break;
  355.   case 3:
  356.     Level->site[x][y].locchar = CLOSED_DOOR;
  357.     Level->site[x][y].p_locf = L_THIEVES_GUILD;
  358.     CitySiteList[L_THIEVES_GUILD-CITYSITEBASE][1] = x;
  359.     CitySiteList[L_THIEVES_GUILD-CITYSITEBASE][2] = y;
  360.     break;
  361.   case 4:
  362.     Level->site[x][y].locchar = OPEN_DOOR;
  363.     Level->site[x][y].p_locf = L_HEALER;
  364.     CitySiteList[L_HEALER-CITYSITEBASE][1] = x;
  365.     CitySiteList[L_HEALER-CITYSITEBASE][2] = y;
  366.     break;
  367.   case 5:
  368.     Level->site[x][y].locchar = OPEN_DOOR;
  369.     Level->site[x][y].p_locf = L_CASINO;
  370.     CitySiteList[L_CASINO-CITYSITEBASE][1] = x;
  371.     CitySiteList[L_CASINO-CITYSITEBASE][2] = y;
  372.     break;
  373.   case 7: 
  374.     Level->site[x][y].locchar = OPEN_DOOR;
  375.     Level->site[x][y].p_locf = L_DINER;
  376.     CitySiteList[L_DINER-CITYSITEBASE][1] = x;
  377.     CitySiteList[L_DINER-CITYSITEBASE][2] = y;
  378.     break;
  379.   case 8: 
  380.     Level->site[x][y].locchar = OPEN_DOOR;
  381.     Level->site[x][y].p_locf = L_CRAP;
  382.     CitySiteList[L_CRAP-CITYSITEBASE][1] = x;
  383.     CitySiteList[L_CRAP-CITYSITEBASE][2] = y;
  384.     break;
  385.   case 6:
  386.   case 9: 
  387.   case 20: 
  388.     Level->site[x][y].locchar = OPEN_DOOR;
  389.     Level->site[x][y].p_locf = L_COMMANDANT;
  390.     CitySiteList[L_COMMANDANT-CITYSITEBASE][1] = x;
  391.     CitySiteList[L_COMMANDANT-CITYSITEBASE][2] = y;
  392.     break;
  393.   case 21:
  394.     Level->site[x][y].locchar = OPEN_DOOR;
  395.     Level->site[x][y].p_locf = L_TAVERN;
  396.     CitySiteList[L_TAVERN-CITYSITEBASE][1] = x;
  397.     CitySiteList[L_TAVERN-CITYSITEBASE][2] = y;
  398.     break;
  399.   case 10:
  400.     Level->site[x][y].locchar = OPEN_DOOR;
  401.     Level->site[x][y].p_locf = L_ALCHEMIST;
  402.     CitySiteList[L_ALCHEMIST-CITYSITEBASE][1] = x;
  403.     CitySiteList[L_ALCHEMIST-CITYSITEBASE][2] = y;
  404.     break;
  405.   case 11:
  406.     Level->site[x][y].locchar = OPEN_DOOR;
  407.     Level->site[x][y].p_locf = L_DPW;
  408.     CitySiteList[L_DPW-CITYSITEBASE][1] = x;
  409.     CitySiteList[L_DPW-CITYSITEBASE][2] = y;
  410.     break;
  411.   case 12:
  412.     Level->site[x][y].locchar = OPEN_DOOR;
  413.     Level->site[x][y].p_locf = L_LIBRARY;
  414.     CitySiteList[L_LIBRARY-CITYSITEBASE][1] = x;
  415.     CitySiteList[L_LIBRARY-CITYSITEBASE][2] = y;
  416.     break;
  417.   case 13:
  418.     Level->site[x][y].locchar = OPEN_DOOR;
  419.     Level->site[x][y].p_locf = L_PAWN_SHOP;
  420.     CitySiteList[L_PAWN_SHOP-CITYSITEBASE][1] = x;
  421.     CitySiteList[L_PAWN_SHOP-CITYSITEBASE][2] = y;
  422.     break;
  423.   case 14:
  424.     Level->site[x][y].locchar = OPEN_DOOR;
  425.     Level->site[x][y].p_locf = L_CONDO;
  426.     CitySiteList[L_CONDO-CITYSITEBASE][1] = x;
  427.     CitySiteList[L_CONDO-CITYSITEBASE][2] = y;
  428.     break;
  429.   case 15:
  430.     Level->site[x][y].locchar = CLOSED_DOOR;
  431.     Level->site[x][y].p_locf = L_BROTHEL;
  432.     CitySiteList[L_BROTHEL-CITYSITEBASE][1] = x;
  433.     CitySiteList[L_BROTHEL-CITYSITEBASE][2] = y;
  434.     break;
  435.   default:
  436.     Level->site[x][y].locchar = CLOSED_DOOR;
  437.     switch(random_range(6)) {
  438.     case 0: Level->site[x][y].p_locf = L_HOVEL; break;
  439.     case 1: case 2: case 3:
  440.     case 4: Level->site[x][y].p_locf = L_HOUSE; break;
  441.     case 5: Level->site[x][y].p_locf = L_MANSION; break;
  442.     }
  443.     if(random_range(5)) Level->site[x][y].aux = LOCKED;
  444.     break;
  445.   }
  446.   next++;
  447. }
  448.  
  449.   
  450.  
  451.  
  452. /* makes a hiscore npc for mansions */
  453. void make_justiciar(i,j)
  454. int i,j;
  455. {
  456.   pml ml = ((pml) checkmalloc(sizeof(mltype)));
  457.   ml->m = ((pmt) checkmalloc(sizeof(montype)));
  458.   *(ml->m) = Monsters[NPC];
  459.   make_hiscore_npc(ml->m,15);
  460.   ml->m->x = i;
  461.   ml->m->y = j;
  462.   Level->site[i][j].creature = ml->m;
  463.   ml->m->click = (Tick + 1) % 60;
  464.   ml->next = Level->mlist;
  465.   Level->mlist = ml;
  466.   m_status_reset(ml->m,AWAKE);
  467. }
  468.  
  469.  
  470.  
  471. /* loads the city level */
  472. void resurrect_guards()
  473. {
  474.   int i,j;
  475.   char site;
  476.   
  477.   FILE *fd;
  478.   
  479.   strcpy(Str3,Omegalib);
  480.   strcat(Str3,"city.dat");
  481.   fd = checkfopen(Str3,"rb");
  482.   site = cryptkey("city.dat");
  483.   for(j=0;j<LENGTH;j++) {
  484.     for(i=0;i<WIDTH;i++) {
  485.       site = getc(fd)^site;
  486.       if (site == 'G') {
  487.     make_site_monster(i,j,ML0+3);
  488.     Level->site[i][j].creature->monstring = "undead guardsman";
  489.     Level->site[i][j].creature->meleef = M_MELEE_SPIRIT;
  490.     Level->site[i][j].creature->movef = M_MOVE_SPIRIT;
  491.     Level->site[i][j].creature->strikef = M_STRIKE_MISSILE;
  492.     Level->site[i][j].creature->immunity = EVERYTHING-pow2(NORMAL_DAMAGE);
  493.     Level->site[i][j].creature->hp *= 2;
  494.     Level->site[i][j].creature->hit *= 2;
  495.     Level->site[i][j].creature->dmg *= 2;
  496.     Level->site[i][j].creature->ac *= 2;
  497.     m_status_set(Level->site[i][j].creature,HOSTILE);
  498.     m_status_set(Level->site[i][j].creature,AWAKE);
  499.       }
  500.     }
  501.     site = getc(fd)^site;
  502.   }
  503.   fclose(fd);
  504. }
  505.  
  506.  
  507. void mazesite(i,j,populate)
  508. int i,j,populate;
  509. {
  510.   static FILE *fd=NULL;
  511.   static int k=0;
  512.   static char site;
  513.   if (fd==NULL) {
  514.     strcpy(Str2,Omegalib);
  515.     strcpy(Str4,"maze .dat");
  516.     Str4[4]='1'+random_range(4);
  517.     strcat(Str2,Str4);
  518.     fd = checkfopen(Str2,"rb");
  519.     site = cryptkey("mazes");
  520.   }
  521.   site = getc(fd)^site;
  522.   k++;
  523.   if (k == 286) fclose(fd);
  524.   switch(site) {
  525.   case '"':
  526.     Level->site[i][j].locchar = HEDGE;
  527.     if (random_range(10))
  528.       Level->site[i][j].p_locf = L_HEDGE;
  529.     else
  530.       Level->site[i][j].p_locf = L_TRIFID;
  531.     break;
  532.   case '-':
  533.     Level->site[i][j].locchar = CLOSED_DOOR;
  534.     break;
  535.   case '.':
  536.     Level->site[i][j].locchar = FLOOR;
  537.     break;
  538.   case '>':
  539.     Level->site[i][j].locchar = STAIRS_DOWN;
  540.     Level->site[i][j].p_locf = L_SEWER;
  541.     break;
  542.   case 'z':
  543.     Level->site[i][j].locchar = FLOOR;
  544.     Level->site[i][j].p_locf = L_MAZE;
  545.     break;
  546.   case 'O':
  547.     Level->site[i][j].locchar = OPEN_DOOR;
  548.     Level->site[i][j].p_locf = L_ORACLE;
  549.     CitySiteList[L_ORACLE-CITYSITEBASE][1] = i;
  550.     CitySiteList[L_ORACLE-CITYSITEBASE][2] = j;
  551.     break;
  552.   case '?':
  553.     randommazesite(i,j,populate);
  554.     break;
  555.   }
  556.   lreset(i,j,SEEN);
  557. }
  558.  
  559. void randommazesite(i,j,populate)
  560. int i,j,populate;
  561. {
  562.   switch(random_range(7)) {
  563.   case 0: case 1:
  564.     Level->site[i][j].locchar = FLOOR;
  565.     Level->site[i][j].p_locf = TRAP_BASE+random_range(NUMTRAPS);
  566.     break;
  567.   case 2: case 3:
  568.     Level->site[i][j].locchar = FLOOR;
  569.     if (populate)
  570.       make_site_monster(i,j,-1);
  571.     break;
  572.   case 4: case 5:
  573.     Level->site[i][j].locchar = FLOOR;
  574.     if (populate)
  575.       make_site_treasure(i,j,5);
  576.     break;
  577.   default:
  578.     Level->site[i][j].locchar = FLOOR;    
  579.   }
  580. }
  581.  
  582.  
  583. /* undead are not hostile unless disturbed.... */
  584. void make_minor_undead(i,j)
  585. int i,j;
  586. {
  587.   int mid;
  588.   if (random_range(2)) mid = ML2+6; /*ghost */
  589.   else mid = ML4+5; /*haunt*/
  590.   make_site_monster(i,j,mid);
  591.   m_status_reset(Level->site[i][j].creature,AWAKE);
  592.   m_status_reset(Level->site[i][j].creature,HOSTILE);
  593. }    
  594.  
  595. /* undead are not hostile unless disturbed.... */
  596. void make_major_undead(i,j)
  597. int i,j;
  598. {
  599.   int mid;
  600.   if (random_range(2)) mid = ML6+5; /* lich */
  601.   else mid = ML9+5; /*vampire lord*/
  602.   make_site_monster(i,j,mid);
  603.   m_status_reset(Level->site[i][j].creature,AWAKE);
  604.   m_status_reset(Level->site[i][j].creature,HOSTILE);
  605. }    
  606.  
  607.  
  608. static char jail[5][11] = 
  609. {
  610.    { '#', '#', '*', '#', '#', '*', '#', '#', '*', '#', '#' },
  611.    { '#', '#', '*', '#', '#', '*', '#', '*', '#', '#', '#' },
  612.    { '#', '#', 'T', '#', 'T', '#', 'T', '#', 'T', '#', '#' },
  613.    { '#', '#', '7', '#', '7', '#', '7', '#', '7', '#', '#' },
  614.    { '#', '#', 'R', '#', 'R', '#', 'R', '#', 'R', '#', '#' }
  615. };
  616.  
  617. /* fixes up the jail in case it has been munged by player action */
  618. void repair_jail()
  619. {
  620.   int i,j;
  621.   for(i=0;i<11;i++)
  622.     for(j=0;j<5;j++) {
  623.       switch(jail[j][i]) {
  624.       case '#':
  625.     City->site[i+35][j+52].locchar = WALL;
  626.     City->site[i+35][j+52].p_locf = L_NO_OP;
  627.     City->site[i+35][j+52].aux = NOCITYMOVE;
  628.     break;
  629.       case '*':
  630.     City->site[i+35][j+52].locchar = WALL;
  631.     City->site[i+35][j+52].p_locf = L_NO_OP;
  632.     City->site[i+35][j+52].aux = 10;
  633.     break;
  634.       case 'T':
  635.     City->site[i+35][j+52].locchar = FLOOR;
  636.     City->site[i+35][j+52].p_locf = L_PORTCULLIS_TRAP;
  637.     City->site[i+35][j+52].aux = NOCITYMOVE;
  638.     break;
  639.       case '7':
  640.     City->site[i+35][j+52].locchar = FLOOR;
  641.     City->site[i+35][j+52].p_locf = L_PORTCULLIS;
  642.     City->site[i+35][j+52].aux = NOCITYMOVE;
  643.     break;
  644.       case 'R':
  645.     City->site[i+35][j+52].locchar = FLOOR;
  646.     City->site[i+35][j+52].p_locf = L_RAISE_PORTCULLIS;
  647.     City->site[i+35][j+52].aux = NOCITYMOVE;
  648.     break;
  649.       }
  650.       lreset(i+35, j+52, CHANGED);
  651.     }
  652. }
  653.